package com.password.util;

import java.io.File;
import java.io.InputStream;
import java.util.Properties;

/**
 * 系统配置类
 * 
 * @author yzh
 * @date 2020年5月27日
 *
 */
public class SystemConfig {
	private static final SystemConfig config = new SystemConfig();
	/* 版本号 */
	public static final String version = "1.0.0";

	/* 应用路径 */
	private static final File contextPath = new File(System.getProperty("user.home"),
			"." + config.sysProp.getProperty("projectName", "passwordManager"));

	/* 缓存路径 */
	private static final File tempPath = new File(contextPath, config.sysProp.getProperty("tempPath", "temp"));

	/* rsa加密的keySize */
	private static final int rsaKeySize = 1024;

	/* 私钥保存的文件后缀 */
	private final static String privateKeySuffix = ".privateKey";

	/* 应用配置文件 */
	private final Properties sysProp;

	static {
		if (!contextPath.exists()) {
			contextPath.mkdirs();
		}
		if (!tempPath.exists()) {
			tempPath.mkdirs();
		}
	}

	private SystemConfig() {
		sysProp = new Properties();
		try (InputStream resourceAsStream = SystemConfig.class.getResourceAsStream("/init.properties");) {
			sysProp.load(resourceAsStream);
		} catch (Exception e) {
		}
	}

	public static File getContextPath() {
		return contextPath;
	}

	public static File getTempPath() {
		return tempPath;
	}

	public static String getProjectName() {
		return config.sysProp.getProperty("projectName", "passwordManager");
	}

	/**
	 * 获取RSA keysize值
	 * 
	 * @author yzh
	 * @date 2020年5月27日
	 * 
	 */
	public static int getRSAkeySize() {
		return rsaKeySize;
	}

	/**
	 * <pre>
	 * RSA的输入和输出的Block的大小是不一样的，Block的大小依赖于你所使用的RSA Key的长度和RSA的padding模式。
	 * 在RSAUtils测试用例中，分别对RSA设置三种长度的Key（768,1024,2048）和2种padding模式（PKCS
	 * 1.5和OAEP），结果如下: 
	 * RSA                InBlock大小   OutBlock大小  (单位，字节)
	 * 768bit/PKCS        85               96 
	 * 1024bit/PKCS      117              128 
	 * 2048bit/PKCS      245              256 
	 * 768bit/OAEP       54               96 
	 * 1024bit/OAEP      86               128 
	 * 2048bit/OAEP     214               256
	 </pre>
	 */
	public static int getRSAOutBlock() {
		return rsaKeySize / 8;
	}

	public static int getRSAInBlock() {
		return rsaKeySize / 8 - 11;
	}

	public static String getPrivateKeySuffix() {
		return privateKeySuffix;
	}

	public static String getUserPrivateKeyFileName(String userName) {
		return "." + userName.trim() + SystemConfig.getPrivateKeySuffix();
	}

	/**
	 * 获取文件加密过程使用RSA加密时，加密数据的大小阙值，最大加密大小为=getRSAOutBlock()*该值,默认为1000倍
	 * @author yzh
	 * @date 2020年5月28日
	 *  
	 * @return
	 */
	public static int getRSAFileEncrotyNum() {
		String property = config.sysProp.getProperty("RSAFileTimes", "1000");
		int result = 1000;
		try {
			result = Integer.parseInt(property);
		} catch (Exception e) {
			// 忽略解密失败的场景
		}
		return result;
	}

	/**
	 * 获取DES加密和解密的bufferSize，用于文件加密
	 * @author yzh
	 * @date 2020年5月28日
	 *  
	 * @return
	 */
	public static int getDesEncrptBufferSize() {
		String property = config.sysProp.getProperty("desEncrptBufferSize", "2048");
		int result = 2048;
		try {
			result = Integer.parseInt(property);
		} catch (Exception e) {
			// 忽略解密失败的场景
		}
		return result;
	}

}
